根据我在互联网上的一些博客文章中阅读的信息,我已经在我的应用程序中实现了对CSRF 攻击的缓解。特别是这些帖子是我实施的驱动力
基本上这些文章和建议说,为了防止 CSRF 攻击,任何人都应该实现以下代码:
[ValidateAntiForgeryToken]
[HttpPost] [ValidateAntiForgeryToken] public ActionResult SomeAction( SomeModel model ) { }
<%= Html.AntiForgeryToken() %>
无论如何,在我的应用程序的某些部分,我正在使用 jQuery 向服务器发送 Ajax POST,根本没有任何形式。例如,当我让用户单击图像以执行特定操作时,就会发生这种情况。
假设我有一张包含活动列表的表格。我在表格的一列上有一张图片,上面写着“将活动标记为已完成”,当用户单击该活动时,我正在执行 Ajax POST,如下例所示:
$("a.markAsDone").click(function (event) { event.preventDefault(); $.ajax({ type: "post", dataType: "html", url: $(this).attr("rel"), data: {}, success: function (response) { // .... } }); });
<%= Html.AntiForgeryToken() %>在这些情况下我该如何使用?我应该在 Ajax 调用的 data 参数中包含辅助调用吗?
对不起,很长的帖子,非常感谢您的帮助
编辑 :
根据jayrdub的回答,我使用了以下方式
$("a.markAsDone").click(function (event) { event.preventDefault(); $.ajax({ type: "post", dataType: "html", url: $(this).attr("rel"), data: { AddAntiForgeryToken({}), id: parseInt($(this).attr("title")) }, success: function (response) { // .... } }); });
我使用这样的简单js函数
AddAntiForgeryToken = function(data) { data.__RequestVerificationToken = $('#__AjaxAntiForgeryForm input[name=__RequestVerificationToken]').val(); return data; };
由于页面上的每个表单都将具有相同的令牌值,因此只需在最顶层的母版页中添加类似的内容
<%-- used for ajax in AddAntiForgeryToken() --%> <form id="__AjaxAntiForgeryForm" action="#" method="post"><%= Html.AntiForgeryToken()%></form>
然后在您的 ajax 调用中执行(编辑以匹配您的第二个示例)
$.ajax({ type: "post", dataType: "html", url: $(this).attr("rel"), data: AddAntiForgeryToken({ id: parseInt($(this).attr("title")) }), success: function (response) { // .... } });